package com.chen.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.chen.common.MyExpection;
import com.chen.common.PageResult;
import com.chen.common.Result;

import com.chen.convert.EmpConvert;
import com.chen.pojo.EmpDO;
import com.chen.mapper.EmpMapper;
import com.chen.service.IEmpService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.chen.vo.emp.EmpCreateReqVO;
import com.chen.vo.emp.EmpPageReqVO;
import com.chen.vo.emp.EmpUpdateReqVO;
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

import static com.chen.constants.ErrorCodeConstants.EMP_NOT_EXIST;
import static com.chen.constants.ErrorCodeConstants.EMP_USERNAME_NOT_UNIQUE;

/**
 * <p>
 * 员工表 服务实现类
 * </p>
 *
 * @author chen
 * @since 2024-04-10
 */
@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, EmpDO> implements IEmpService {
    @Resource
    public EmpMapper empMapper;

    /**
     * 获的员工分页
     * @param reqVO
     * @return
     */
    @Override
    public Result getPage(EmpPageReqVO reqVO) {

        PageResult<EmpDO> pageResult = empMapper.selectPage(reqVO);
        return Result.success(pageResult);
    }

    /**
     * 批量删除员工
     * @param ids
     * @return
     */
    @Override
    public Result deleteEmpByIds(List<Integer> ids) {
        if(CollUtil.isEmpty(ids)){
            return Result.success(true);
        }
        empMapper.deleteBatchIds(ids);
        return Result.success(true);
    }

    /**
     * 创建员工
     * @param reqVO
     * @return
     */
    @Override
    public Result createEmp(EmpCreateReqVO reqVO) {
        //判断用户名是否存在
        validatedUserNameUnique(reqVO.getUsername(),null);
        //数据转化
        EmpDO empDO=EmpConvert.INSTANCE.convert01(reqVO);
        //添加数据
        empDO.setPassword("123456");
        //创建
        empMapper.insert(empDO);
        //返回
        return Result.success(true);
    }

    /**
     * 根据id获取员工
     * @param id
     * @return
     */
    @Override
    public Result getEmpById(Integer id) {
        return  Result.success(empMapper.selectById(id));
    }

    /**
     * 修改员工
     * @param reqVO
     * @return
     */
    @Override
    public Result updateEmp(EmpUpdateReqVO reqVO) {
        //检验用户名
        validatedUserNameUnique(reqVO.getUsername(),reqVO.getId());
        //校验员工id存不存在
        vaildatedUserId(reqVO.getId());
        //数据转化
       EmpDO empDO= EmpConvert.INSTANCE.convert01(reqVO);
        //更新
        empMapper.updateById(empDO);
        //返回
        return Result.success(true);
    }

    @Override
    public EmpDO getEmpByUserName(String username) {
      return   empMapper.selectEmpByUsername(username);
    }

    /**
     * 校验用户id存不存在
     * @param id
     */
    @SneakyThrows
    private void vaildatedUserId(Integer id) {
        EmpDO empDO = empMapper.selectById(id);
        if(ObjectUtil.isNull(empDO)){
            throw new MyExpection(EMP_NOT_EXIST);
        }
    }

    /**
     * 校验用户名不能重复
     * @param username
     */
    @SneakyThrows
    private void validatedUserNameUnique(String username,Integer id) {
        EmpDO empDO=empMapper.selectEmpByUsername(username);
        if(ObjectUtil.isNotNull(empDO)&&!empDO.getId().equals(id)){
            throw new MyExpection(EMP_USERNAME_NOT_UNIQUE);
        }
    }
}
